package xyz.xiezc.spider.common;

import lombok.Data;
import lombok.Synchronized;

import java.time.LocalDateTime;
import java.util.*;

/**
 * 一个XBean要对应一个页面, 但是一个页面中可能有很多请求. 比如图片,  而图片又是需要下载的下来的,
 * 所以这里可以定义多个Request,  所有Request都下载完成后才算完成一个 Xbean
 *
 * @author wb-xzc291800
 * @date 2019/04/02 17:29
 */
@Data
public class XBean {
    /**
     * 保存额外信息的
     */
    Map<String, Object> other = new HashMap<>();

    Request request;

    Response response;


    /**
     * 解析后的生成的对象, 一般用于保存到数据库中
     */
    List bean = new ArrayList<>();

    /**
     * 0, 是初始 URL 未请求的
     * 1, 派生的req , 未请求的
     * 2, 请求完成, 未解析的
     * 3, 解析完成的, 还没有业务逻辑处理的
     * 4, 业务逻辑处理完成了,但是派生的url还没有进行去重处理的对象
     * 5, 派生的url进行了去重处理后的
     */
    int status;

    List<Request> nextRequests = new ArrayList<>();
    /**
     * 记录这个bean爬取的过程中的每次异常和时间
     * <p>
     * Map中两个key, 一个是time , 一个是errMsg
     */
    private List<Map<String, String>> errorMsg = new ArrayList<>();


    public XBean() {
    }

    public XBean(Request request) {
        this.request = request;
    }

    public XBean(Request request, int status) {
        this.request = request;
        this.status = status;
    }

    public void addBean(Object t) {
        this.bean.add(t);
    }

    @Synchronized
    public int getErrCount() {
        return errorMsg.size();
    }

    @Synchronized
    public void addErrMsg(String s) {
        Map<String, String> map = new HashMap<>();
        map.put("time", LocalDateTime.now().toString());
        map.put("errMsg", s);
        errorMsg.add(map);
    }

    public void addOther(String key, Object obj) {
        other.put(key, obj);
    }

    public Object getOther(String key) {
        return other.get(key);
    }


    public void addNextRequest(Request request) {
        nextRequests.add(request);
    }

    public void addNextRequest(Collection request) {
        nextRequests.addAll(request);
    }
}
